/**
 * Time：2024.04.28
 * Content：线程中数据未定义错误
 * Author：Qian You
 */
#include <iostream>
#include <bits/stdc++.h>
// 头文件
#include <thread>
#include <memory> // 智能指针头文件
using namespace std;

class A
{
public:
    void fooA()
    {
        cout << "Hello fooA" << endl;
    }

private:
    friend void thread_foo();
    void fooB()
    {
        cout << "Hello fooB" << endl;
    }
};

void foo(int &x)
{
    x += 1;
}

void thread_foo()
{
    shared_ptr<A> a = make_shared<A>();
    thread t(&A::fooB, a);
    t.join();
}

int main()
{
    // 问题1：传递引用类型不能用临时变量
    // 调整前
    // thread t(foo, 1); // 会报错，因为foo要求引用类型的变量，而1是个临时变量，用完就销毁了，不是引用类型
    // 调整后
    // int a = 1;
    // thread t(foo, ref(a));

    // t.join();
    // cout << a << endl;

    // 问题2：传递指针或引用指向局部变量的问题，内存被释放掉
    // 调整后 使用智能指针解决
    // shared_ptr<A> a = make_shared<A>();
    // thread t(&A::fooA, a);
    // t.join();

    // 问题3：调用私有成员函数
    thread_foo();
    return 0;
}